 /* 
 * Copyright 2013 Dominik Korittki, Steffen Gruschka

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

package ejb;

import entity.Gruppen;
import entity.Mitarbeiter;
import entity.Nutzer;
import entity.Raum;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 * Diese Klasse ist zuständig für die Kommunikation mit der Datenbank
 * @author Dominik K
 * @author Steffen G
 */
@Stateless
public class EJBManager {
    /**
     * Entity-Manager zur direkten Kommunikation mit der DB
     */
    @PersistenceContext(unitName = "Gruschka_Korittki_PU")
    private EntityManager em;
    
    /**
     * Persistierung einer Entität (z.B. Mitarbeiter, Räume, Nutzer)
     * @param o Entität, welche persistiert werden soll
     */
    public void persist(Object o) {
        em.persist(o);
    }
    
    /**
     * Überschreibung bereits vorhandener Entitäten
     * @param o Entität, welche gemergt werden soll
     */
    public void merge(Object o) {
        em.merge(o);
    }
    
    /**
     * Löschen von Mitarbeitern
     * @param o zu löschender Mitarbeiter
     */
    public void remove(Mitarbeiter o) {
        Mitarbeiter m = findeMitarbeiter(o.getKennkartenNr());
        em.remove(m);
    }
    
    /**
     * Löschen von Räumen
     * @param o zu löschender Raum
     */
    public void remove(Raum o) {
        Raum r = findeRaum(new Long(o.getId()));
        em.remove(r);
    }
    
    /**
     * Löschen von Systemnutzern
     * @param o zu löschender Nutzer
     */
    public void remove(Nutzer o) {
        Nutzer n = findeNutzer(o.getUsername());
        em.remove(n);
    }
    
    /**
     * Löschen von Gruppeneinträgen von Systemnutzern
     * @param o zu löschende Gruppe
     */
    public void remove(Gruppen o) {
        Gruppen g = findeGruppen(o.getId());
        em.remove(g);
    }
    
    /**
     * Gibt alle vorhandenen Mitarbeiter als Liste zurück
     * @return Liste aller Mitarbeiter
     */
    public List<Mitarbeiter> getMitarbeiter() {
        return em.createQuery("SELECT m FROM Mitarbeiter m", Mitarbeiter.class)
                .getResultList();
    }
    
    /**
     * Gibt alle vorhandenen Räume als Liste zurück
     * @return Liste aller Räume
     */
    public List<Raum> getRaeume() {
        return em.createQuery("SELECT r FROM Raum r", Raum.class)
                .getResultList();
    }
    
    /**
     * Gibt alle vorhandenen Systemnutzer als Liste zurück
     * @return Liste aller Nutzer
     */
    public List<Nutzer> getNutzer() {
        return em.createQuery("SELECT n FROM Nutzer n", Nutzer.class)
                .getResultList();
    }
    
    /**
     * Gibt alle vorhandenen Gruppeneinträge als Liste zurück
     * @return Liste aller Gruppeneinträge
     */
    public List<Gruppen> getGruppen() {
        return em.createQuery("SELECT g FROM Gruppen g", Gruppen.class)
                .getResultList();
    }
    
    /**
     * Finden eines Mitarbeiters in der DB anhand seiner Kennkartennr
     * @param kennkartenNr KennkartenNr des Mitarbeiters
     * @return der Mitarbeiter
     */
    public Mitarbeiter findeMitarbeiter(Long kennkartenNr) {
        return em.find(Mitarbeiter.class, kennkartenNr);
    }
    
    /**
     * Finden eines Raumes in der DB anhand seiner ID
     * @param id ID des Raumes
     * @return der Raum
     */
    public Raum findeRaum(Long id) {
        return em.find(Raum.class, id);
    }
    
    /**
     * Finden eines Systemnutzers in der DB anhand seines Namens
     * @param username Benutzername des Nutzers
     * @return der Nutzer
     */
    public Nutzer findeNutzer(String username) {
        return em.find(Nutzer.class, username);
    }
    
    /**
     * Finden eines Gruppeneintrages in der DB anhand seiner ID
     * @param id id des Gruppeneintrages
     * @return der Gruppeneintrag
     */
    public Gruppen findeGruppen(Long id) {
        return em.find(Gruppen.class, id);
    }
    
    /**
     * Finden von allen Gruppeneinträgen eines bestimmten Systemnutzers
     * @param username der Benutzer
     * @return Alle Gruppen des Benutzers
     */
    public List<Gruppen> findeGruppen(String username) {
        String query = "SELECT g FROM Gruppen g WHERE g.username = '" + username + "'";
        List<Gruppen> result = em.createQuery(query).getResultList();
        return result;
    }
}
